//
//  UITextView+Extension.swift
//  Project03-Weibo-swift
//
//  Created by w on 16/1/31.
//  Copyright © 2016年 w. All rights reserved.
//

import UIKit

extension UITextView {
    
    func insertEmotion(emotion: CXEmotion) {
        
        if emotion.isEmoji {
            ///  系统帮我们完成了取文本 替换光标处内容，发送文字改变通知 代理方法的实现
            self.insertText((emotion.code! as NSString).emoji())
        } else {
            //1. 取出原来的富文本并包装成可修改的属性集
            let originAttr = NSMutableAttributedString(attributedString: self.attributedText)
            
            //2. 通过表情模型生成图片,然后通过图片生成附件
            let image = UIImage(named: "\(emotion.path!)/\(emotion.png!)", inBundle: CXEmotionTools.sharedTool.emotionBundle, compatibleWithTraitCollection: nil)
            
            let imgAttchment = CXTextAttachment()
            imgAttchment.image = image
            imgAttchment.emotion = emotion
            //3. 获取行高，让表情附件的尺寸与文字行高一致 位置对齐
            let lineH = self.font!.lineHeight
            imgAttchment.bounds = CGRect(x: 0, y: -4, width: lineH, height: lineH) //y是控件边框相对于内容的坐标
            
            //4. 通过附件生成富文本
            let addAttr = NSAttributedString(attachment: imgAttchment)
                //4.1 获取光标所在位置 方便之后的修改
            var cursorPos = self.selectedRange
            //5. 插入到当前文本中（包括替换选中内容操作）
            originAttr.replaceCharactersInRange(cursorPos, withAttributedString: addAttr)
            
            //6. 添加一个字体大小的属性(否则新添加的表情后面的文字都会变小) 字体大小与当前textView一致
            originAttr.addAttribute(NSFontAttributeName, value: self.font!, range: NSMakeRange(0, originAttr.length))
            //7. 更新当前textView的富文本
            self.attributedText = originAttr
            //8. 调整光标位置 否则默认光标位置会在修改内容完毕后回到文本最后位置
            cursorPos.location++
            cursorPos.length = 0
            self.selectedRange = cursorPos
            
            //9. 发送文字改变通知 让占位标签隐藏。同时响应代理方法,让发送按钮被点亮
            NSNotificationCenter.defaultCenter().postNotificationName(UITextViewTextDidChangeNotification, object: self) //通知发布者 是自身
            delegate?.textViewDidChange?(self)  //该方法是可选方法 不一定被实现 因此标记问号
        }
    }
    /// 返回文本与表情混排信息
    var emotionText: String {
        
        var resText = ""
        
        //遍历富文本
        self.attributedText.enumerateAttributesInRange(NSMakeRange(0, self.attributedText.length), options: []) { (contentType, range, stop) -> Void in
            
            // contentType是个字典 包含附件 文本信息等富文本属性
            // range: 文本内容所在的位置和长度
            // 现在能够直接取到的就是  NSTextAttachment ,想要取到其对应的表情模型
            // 那么就可以在我们初始化这个 NSTextAttachment 的时候,给设置一个表情模型 --> 自定义一个继承于 NSTextAttachment 的文字附件的对象 --> emoticon
            if let attachment = contentType["NSAttachment"] as? CXTextAttachment {
                //表情
                resText += attachment.emotion?.chs ?? ""
            } else {
                //文本；包含 emoji
                resText += (self.attributedText.string as NSString).substringWithRange(range)
            }
        }
        return resText
    }
}
